<?php
/**
 * PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码，请写两个替代的函数实现兼容Unicode文字的字符串大小写转换
 * @param  [type] $str [description]
 * @return [type]      [description]
 */
function mystrtoupper($str){
 $tmpArr=str_split($str,1);
 $rStr='';
 foreach($tmpArr as $v){
    $v=ord($v);
    if($v>=97&&$v<=122){
      $v-=32;
    }
    $rStr.=chr($v);
 }
 return $rStr;
}

/**
 * PHP的is_writeable()函数存在Bug，无法准确判断一个目录/文件是否可写，请写一个函数来判断目录/文件是否绝对可写
	1、在windowns中，当文件只有只读属性时，is_writeable()函数才返回false，当返回true时，该文件不一定是可写的。 
	如果是目录，在目录中新建文件并通过打开文件来判断； 
	如果是文件，可以通过打开文件（fopen），来测试文件是否可写。 
	2、在Unix中，当php配置文件中开启safe_mode时(safe_mode=on)，is_writeable()同样不可用。
 */
function is_really_writable($file)
{
  // If we're on a Unix server with safe_mode off we call is_writable
  // DIRECTORY_SEPARATOR PHP内置常量，目录分割符
  if(DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE){
    return is_writable($file);
  }

  // For windows servers and safe_mode "on" installations we'll actually
  // write a file then read it.  Bah...
  if(is_dir($file)){
    $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));
    if(($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE){
        return FALSE;
    }

    fclose($fp);
    @chmod($file, DIR_WRITE_MODE);
    @unlink($file);
    return TRUE;
  }elseif(!is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE){
    return FALSE;
  }

  fclose($fp);
  return TRUE;
}

/**
 *二维数组排序
 *
*SORT_ASC - 默认，按升序排列。(A-Z)
SORT_DESC - 按降序排列。(Z-A)
随后可以指定排序的类型：
SORT_REGULAR - 默认。将每一项按常规顺序排列。
SORT_NUMERIC - 将每一项按数字顺序排列。
SORT_STRING - 将每一项按字母顺序排列
 */
function my_sort($arrays,$sort_key,$sort_order=SORT_DESC,$sort_type=SORT_NUMERIC ){   
    if(is_array($arrays)){   
        foreach ($arrays as $array){   
            if(is_array($array)){   
                $key_arrays[] = $array[$sort_key];   
            }else{   
                return false;   
            }   
        }   
    }else{   
        return false;   
    }  
    array_multisort($key_arrays,$sort_order,$sort_type,$arrays);   
    return $arrays;   
}  

/**
 * 格式化打印数组 来自thinkphp
 */
function dump($var, $echo=true, $label='<pre>', $strict=false) {
    $label = ($label === null) ? '' : rtrim($label) . ' ';
    if (!$strict) {
        if (ini_get('html_errors')) {
            $output = print_r($var, true);
            $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
        } else {
            $output = $label . print_r($var, true);
        }
    } else {
        ob_start();
        var_dump($var);
        $output = ob_get_clean();
        if (!extension_loaded('xdebug')) {
            $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
            $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
        }
    }
    if ($echo) {
        echo($output);
        return null;
    }else
        return $output;
}

/**
 * php判断手机浏览还是web浏览
 */
function isMobile(){  
    $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';  
    $useragent_commentsblock=preg_match('|\(.*?\)|',$useragent,$matches)>0?$matches[0]:'';        
    function CheckSubstrs($substrs,$text){  
        foreach($substrs as $substr)  
            if(false!==strpos($text,$substr)){  
                return true;  
            }  
            return false;  
    }
    $mobile_os_list=array('Google Wireless Transcoder','Windows CE','WindowsCE','Symbian','Android','armv6l','armv5','Mobile','CentOS','mowser','AvantGo','Opera Mobi','J2ME/MIDP','Smartphone','Go.Web','Palm','iPAQ');
    $mobile_token_list=array('Profile/MIDP','Configuration/CLDC-','160×160','176×220','240×240','240×320','320×240','UP.Browser','UP.Link','SymbianOS','PalmOS','PocketPC','SonyEricsson','Nokia','BlackBerry','Vodafone','BenQ','Novarra-Vision','Iris','NetFront','HTC_','Xda_','SAMSUNG-SGH','Wapaka','DoCoMo','iPhone','iPod');  
           
    $found_mobile=CheckSubstrs($mobile_os_list,$useragent_commentsblock) ||  
              CheckSubstrs($mobile_token_list,$useragent);  
           
    if ($found_mobile){  
        return true;  
    }else{  
        return false;  
    }  
}

/**
     * +----------------------------------------------------------
     * 字符串截取，支持中文和其它编码
        +----------------------------------------------------------
     * 
     * @static 
     * @access public +----------------------------------------------------------
     * @param string $str 需要转换的字符串
     * @param string $start 开始位置
     * @param string $length 截取长度
     * @param string $charset 编码格式
     * @param string $suffix 截断显示字符
     * +----------------------------------------------------------
     * @return string +----------------------------------------------------------
     */
function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true)
{
    if (function_exists("mb_substr"))
        return mb_substr($str, $start, $length, $charset);
    elseif (function_exists('iconv_substr')) {
        return iconv_substr($str, $start, $length, $charset);
    } 
    $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
    $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
    $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
    $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
    preg_match_all($re[$charset], $str, $match);
    $slice = join("", array_slice($match[0], $start, $length));
    if ($suffix) return $slice . "…";
    return $slice;
} 
   /**
     * +----------------------------------------------------------
     * 获取一定范围内的随机数字 位数不足补零
     * +----------------------------------------------------------
     * 
     * @param integer $min 最小值
     * @param integer $max 最大值
+----------------------------------------------------------
     * @return string +----------------------------------------------------------
     */
function rand_number ($min, $max)
{
    return sprintf("%0" . strlen($max) . "d", mt_rand($min, $max));
}



